import school.Student;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;


/**
 * 学习Map类型的使用，用MAp管理学生
 * Map包含key-value组合
 * 返回值有三种,keyset()返回key值视图，values()返回values的collection视图，entrySet()返回entry对象
 * Map中添加和修改都是put（）方法
 */

public class MapTest {
    public Map<String , Student> students;

    /**
     * 构造器中初始化students
     *
     */
    public MapTest(){
        this.students=new HashMap<String,Student>();
    }

    /**
     * 测试添加：输入学生|ID,判断是否被占用
     * 若未被占用，则输入姓名，创建新学生对象，并添加到students
     *
     */
    public void testPut(){
        //创建3个学生
        Scanner scanner=new Scanner(System.in);
        int i=0;
        while (i<3){
            System.out.println("请输入学生ID:");
            String id=scanner.next();
            Student st=students.get(id);
            if(st==null){
                System.out.println("请输入学生姓名：");
                String name=scanner.next();
                Student newStudent=new Student(id,name);
                students.put(id,newStudent);
                System.out.println("成功添加学生："+students.get(id).getame());
                i++;
            }else {
                System.out.println("该学生ID已经被占用！");
                continue;
            }
        }
    }

    /**
     * 测试 MAP的 keySet方法,返回Map中所有键的set集合
     *
     */
    public void testKeySet(){
        //通过keySet方法，返回Map中所有键的set集合
        Set<String> keySet=students.keySet();
        //输出学生对象的容量
        System.out.println("学生对象共有："+students.size()+"个学生。");
        //遍历keySet,取得每一个键，再调用get方法取得每一个键对应的Value
        for (String strId:keySet){
            Student st=students.get(strId);
            if(st!=null){
                System.out.println("学生："+st.getame());
            }
        }
    }

    /**
     * 测试 MAP的 删除方法     *
     */
    public void testRemove(){
        //输入要删除学生的ID
        Scanner console=new Scanner(System.in);
        while (true){
            System.out.println("请输入要删除的学生ID:");
            String id=console.next();
            Student st=students.get(id);
            //判断是否有对应ID的学生对象
            if (st==null)        {
                System.out.println("该ID的学生不存在！");
                continue;
            }else {
                students.remove(id);
                System.out.println("已成功删除学生："+st.getame());
                break;
            }
        }
    }

    /**
     * 通过enntrySet方法遍历Map
     *
     */
    public void testEntrySet(){

        Set<Entry<String, Student>> entrySet=students.entrySet();
        System.out.println("—————————现有的学生信息如下—————————");
        for(Entry<String ,Student> entry:entrySet){
            System.out.println("获取的键："+entry.getKey());
            System.out.println("获取的对应值："+entry.getValue().getame());
        }
    }
    /**
     * 利用put方法修改Map中的已有映射
     *
     */
    public void testModify(){
        System.out.println("请输入要修改的学生ID:");
        Scanner console=new Scanner(System.in);
        while (true){
            String stuId=console.next();
            Student student=students.get(stuId);
            if (student==null){
                System.out.println("该ID不存在！请重新输入：");
                continue;
            }else {
                System.out.println("当前你该学生的ID,对应的学生为："+student.getame());
                System.out.println("请输入新的学生姓名：");
                String name=console.next();
                Student newStu=new Student(stuId,name);
                students.put(stuId,newStu);
                System.out.println("修改成功！");
                break;
            }

        }
    }

    /**
     * 测试Map中是否包含某个Key或者Value     *
     */
    public void testContainsKeyOrValue(){
        //在MAp中用containsKey()方法，来判断是否包含某个Key值
        //用containsKValue()方法，来判断是否包含某个Value值
        System.out.println("请输入要查询的学生ID:");
        Scanner console=new Scanner(System.in);
        String id=console.next();
        System.out.println("您输入的学生ID为："+id+",在学生映射表中是否存在："+students.containsKey(id));
        if(students.containsKey(id)){
            System.out.println("对应的学生为："+students.get(id).getame());
        }
        //输入学生姓名查询
        //跟list类似，需要调用底层equal，所以需要在student中重写方法
        System.out.println("请输入要查询的学生姓名：");
        String name=console.next();
        if(students.containsValue(new Student(null,name))){
            System.out.println("学生映射表中，确实包含学生："+name);
        }else {
            System.out.println("不存在这个学生！");
        }

    }

    public static void main(String[] args){
        MapTest mpTest=new MapTest();
        mpTest.testPut();
        mpTest.testKeySet();
        //删除操作
//        mpTest.testRemove();
//        mpTest.testEntrySet();
        //修改操作
//        mpTest.testModify();
//        mpTest.testEntrySet();
        //测试Map中是否包含某个Key或者Value
        mpTest.testContainsKeyOrValue();


    }


}

